<?php
/**
 * Модель RSS подписки. Содержит в себе операции над подписками на RSS потоки, добавление, удаление, проверки.
 * 
 * @package default
 * @author Alexander Sibiryakov
 **/
class Model_RssFeedList extends RL_Model2 {
	private $community_oid;
		
	/*
	 * Устанавливает сообщество в котором будут происходить все действия класса
	 * 
	 * @param int $oid 
	 */
	public function setCommunityOid( $oid ) {
		$this->community_oid = $oid;
	} 
	
	/*
	 * Проверяет, нет ли такого потока в подписке сообщества
	 * @param $url
	 */
	private function checkDuplicate($url, $oid = 0) {
		// проверим на дубликаты
		if ( $oid > 0 ) {
			$c['rssfeed_list']['oid']['!='] = $oid;
		}
		$c['rssfeed_list']['url']['=='] = trim($url);
		$c['rssfeed_list']['community_oid']['=='] = $this->community_oid;
		$c['objects']['is_deleted']['=='] = 0;
		$rs2 = $this->store->find( $c );
		if ($rs2) $obj = $rs2->next();
		if ($obj) return true; // дубликат оказывается есть
		return false;
	}
	
	/*
	 * Добавить подписку на поток в сообщество
	 * вернет 0 если все ок, 1 - если ошибка при сохранении в БД, 2 - если подписка по этому урлу уже есть
	 * @return int
	 * @param $url
	 * @param Magpierss $rss
	 */
	public function addFeed( $url, MagpieRSS $rss, $parent_oid = 0, $title = '' ) {
		
		if ($this->checkDuplicate($url)) return 2;
		
		$data = array(
			"community_oid"=>$this->community_oid,
			"parent_oid"=>$parent_oid,
			"url"=>$url,
			"title"=>$title ? $title : $rss->channel['title'],
			"ttl"=>$rss->channel['ttl'],
			"last_gen"=>RL_CyrDate::newFromTimestamp(strtotime($rss->channel["lastbuilddate"]))->format("%Y-%m-%d %H:%i:%s"),
			"descr"=>$rss->channel["description"]
		);
		
		$feed = $this->store->create( 'frssfeed_list', $data );
		if ($feed->save() && $feed->inSense("rssfeed_list")) return 0; else return 1;
		
	}
	
	/*
	 * Удалить подписку на поток
	 * @return boolean
	 */
	public function rmFeed( $oid ) {
		$c['rssfeed_list']['oid']['=='] = $oid;
		$c['rssfeed_list']['community_oid']['=='] = $this->community_oid;
		$rs2 = $this->store->find( $c );
		if ($rs2) $obj = $rs2->next();
		if ($obj)  {
			$obj->is_deleted = 1;
			if ($obj->save() && $obj->updateSense("rssfeed_list")) return true;
		}
		return false;
	}		
	
	/*
	 * Получить список потоков на которые подписано сообщество
	 * @return array
	 */
	public function getFeedList() {
		
		$db_prefix = $this->db->db_prefix;		
		if (isset($this->community_oid)) 
			$community_oid = "AND `{$db_prefix}class_rssfeed_list`.`community_oid` = ".$this->community_oid;
		else 
			$group_by = "GROUP BY `{$db_prefix}class_rssfeed_list`.`url`"; // полагаем, что от нас хотят просто все подписки
			
		$sql = "SELECT `{$db_prefix}objects`.*
 FROM `{$db_prefix}objects`,`{$db_prefix}class_rssfeed_list`
 WHERE (`{$db_prefix}objects`.`is_deleted` = 0 ".(isset($community_oid) ? $community_oid : "").") 
 AND `{$db_prefix}class_rssfeed_list`.oid=`{$db_prefix}objects`.oid ".(isset($group_by) ? $group_by : "");
 
		$rs2 = $this->store->findSQL( $sql ); 
		if (!$rs2) return NULL;
		
		$subscribes = array();
		while ($obj = $rs2->next()) {
			$s = $obj->data;
			$s['oid'] = $obj->id;
			$subscribes[] = $s;
		}
		return $subscribes;
	}
	
	/*
	 * Получить список сообществ подписанных на фид
	 * @param $feed_oid
	 * @return array
	 */
	public function getCommOidsSubsrcibedToFeed($feed_oid) {
		$db_prefix = $this->db->db_prefix;
		$sql = "SELECT community_oid FROM `{$db_prefix}class_rssfeed_list` WHERE oid=".$feed_oid;
		$rs = $this->db->query($sql);
		if (!$rs) return NULL;
		$oids = array();
		foreach ($rs as $k=>$v) {
			$oids[] = $v['community_oid'];
		}
		return $oids;
	}
	
	/*
	 * Обновить свойства потока в рамках подписки.
	 */
	public function upFeedProps($oid, $ttl, $lastgen, $title, $descr) {
	}

	public function updateFeed( $oid, $url, MagpieRSS $rss, $parent_oid = 0, $title = '' ) {
		if ($this->checkDuplicate($url, $oid)) return 2;
		
		$info = array(
			"community_oid"=>$this->community_oid,
			"parent_oid"=>$parent_oid,
			"url"=>$url,
			"title"=>$title ? $title : $rss->channel['title'],
			"ttl"=>$rss->channel['ttl'],
			"descr"=>$rss->channel["description"]
		);
			
		$feed = $this->store->create('frssfeed_list', $info, $oid);
		
    if ($feed->save() && $feed->updateSense('rssfeed_list', $oid)) {
			return 0;
		} else {
			return 1;
		}
	}	
}
